# @Time : 2020/7/18 15:23
# @Author : Fioman 
# @Phone : 13149920693
"""
在实际提取颜色时,往往不是提取一个特定的值,而是提取一个颜色区间.例如,在Opencv中的HSV模型中,蓝色在H通道内的值是120.
在提取蓝色时,通常将 "蓝色值120"附近的一个区间的值作为提取范围.该区间的半径通常为10左右,例如通常提取[120-10,120+10]范围内的值来指定蓝色.
相比之下,HSV模式中的S通道,V通道的值的取值范围一般是[100,255].这主要是因为,当饱和度和亮度太低时,计算出来的色调可能就不可靠了.

蓝色: 值分布在[110,100,100] 和 [130,255,255] 之间
绿色: 值分布在[50,100,100]  和 [70,255,255]  之间
红色: 值分布在[0,100,100]   和[10,255,255]   之间
"""
import cv2 as cv
import numpy as np


opencv = cv.imread("opencv.png",cv.IMREAD_COLOR)
hsv = cv.cvtColor(opencv,cv.COLOR_BGR2HSV)
cv.imshow("opencv",opencv)

# 指定蓝色值的范围
minBlue = np.array([110,50,50])
maxBlue = np.array([130,255,255])

# 确定蓝色区域
maskBlue = cv.inRange(hsv,minBlue,maxBlue)

# 通过掩码控制按位与运算,锁定蓝色区域
blue = cv.bitwise_and(opencv,opencv,mask=maskBlue)
cv.imshow("blue",blue)

# 指定绿色范围
minGreen = np.array([50,50,50])
maxGreen = np.array([70,255,255])
# 确定蓝色区域
maskGreen = cv.inRange(hsv,minGreen,maxGreen)
green = cv.bitwise_and(opencv,opencv,mask=maskGreen)
cv.imshow("green",green)

# 指定红色范围
minRed = np.array([0,50,50])
maxRed = np.array([30,255,255])
# 确定红色区域
maskRed = cv.inRange(hsv,minRed,maxRed)
red = cv.bitwise_and(opencv,opencv,mask=maskRed)
cv.imshow("red",red)

cv.waitKey(0)
